% coding: utf-8

\subsection{Segunda parte: Network Discovery.}
En esta sección mostraremos dos implementaciones de Network Discovery, utilizando las funciones ARPing e ICMPing.
La idea de las funciones arp\_{}discovery(rango) e icmp\_{}discovery(rango) es determinar, dado un rango de direcciones ip, qué hosts con esas direcciones están vivos y cuáles no. 

El rango lo tomamos en formato CIDR, es decir una direccion IP seguida de su máscara, por ejemplo ``127.0.0.0$/$24''. 
De esta manera para cada ip dentro del rango invocamos a la función \textbf{arping} o \textbf{icmping} definidas anteriormente según corresponda. 

Creemos que el código de nuestros algoritmos puede simplificarse considerablemente, pero el problema fue que estábamos considerando el parámetro del rango como dos direcciones ip: una de inicio y una de fin. Es por esto que hacemos tanto procesamiento de los datos. 

Consideramos que si recibimos una dirección ``127.0.0.1$/$24'' el 1 del último byte debe ``descartarse'' y analizar la red desde la dirección 127.0.0.0, es por esto que al recibir el parámetro se procesa para obtener esta dirección de red. La idea es aplicarle a la dirección la máscara dada con un AND lógico. Nosotras intentamos hacerlo con la función de python y realizamos algunas pruebas con números para ver cómo funcionaba. Dado que esta función no nos daba el resultado deseado, decidimos procesar nosotras este dato ``anulando'' los bits que estén después del bit en la posición dada por el número que nos llega como máscara. Consideramos que esto también se puede simplificar, pero no hicimos a tiempo a investigar más sobre las funciones de python y el por qué no nos daba el resultado esperado.

A continuación, exhibiremos para cada función los resultados obtenidos para distintos rangos:

\subsubsection{arp\_{}discovery(rango)}

\begin{itemize}
\item{Caso 1:} Rango con direcciones IP dentro de nuestra red.

\begin{verbatim}
>>> arp_discovery('10.0.2.0/28')
 
[(False, '10.0.2.0'), (False, '10.0.2.1'), (True, '10.0.2.2'), 
(True, '10.0.2.3'), (True, '10.0.2.4'), (False, '10.0.2.5'), 
(False, '10.0.2.6'), (False, '10.0.2.7'), (False, '10.0.2.8'), 
(False, '10.0.2.9'), (False, '10.0.2.10'), (False, '10.0.2.11'), 
(False, '10.0.2.12'), (False, '10.0.2.13'), (False, '10.0.2.14'), 
(False, '10.0.2.15')]

\end{verbatim}

\item Caso2: Rango con direcciones IP no pertenecientes a nuestra red.

\begin{verbatim}
>>> arp_discovery('200.50.2.18/28')
[(False, '200.50.2.16'), (False, '200.50.2.17'), (False, '200.50.2.18'), 
(False, '200.50.2.19'), (False, '200.50.2.20'), (False, '200.50.2.21'), 
(False, '200.50.2.22'), (False, '200.50.2.23'), (False, '200.50.2.24'), 
(False, '200.50.2.25'), (False, '200.50.2.26'), (False, '200.50.2.27'), 
(False, '200.50.2.28'), (False, '200.50.2.29'), (False, '200.50.2.30'), 
(False, '200.50.2.31')]

\end{verbatim}


\end{itemize}


\subsubsection{icmp\_{}discovery(rango)}

\begin{itemize}
\item{Caso 1:} Rango con direcciones IP dentro de nuestra red.

\begin{verbatim}
>>> icmp_discovery('10.0.2.0/28')
[(False, '10.0.2.0'), (False, '10.0.2.1'), (True, '10.0.2.2'), 
(False, '10.0.2.3'), (False, '10.0.2.4'), (False, '10.0.2.5'), 
(False, '10.0.2.6'), (False, '10.0.2.7'), (False, '10.0.2.8'), 
(False, '10.0.2.9'), (False, '10.0.2.10'), (False, '10.0.2.11'), 
(False, '10.0.2.12'), (False, '10.0.2.13'), (False, '10.0.2.14'), 
(False, '10.0.2.15')]
 
\end{verbatim}

\item{Caso 2:} Rango con direcciones IP no pertenecientes a nuestra red.

\begin{verbatim}
>>> icmp_discovery('200.50.2.18/28') 
[(False, '200.50.2.16'), (False, '200.50.2.17'), (False, '200.50.2.18'), 
(False, '200.50.2.19'), (False, '200.50.2.20'), (False, '200.50.2.21'), 
(False, '200.50.2.22'), (False, '200.50.2.23'), (False, '200.50.2.24'), 
(False, '200.50.2.25'), (False, '200.50.2.26'), (False, '200.50.2.27'), 
(False, '200.50.2.28'), (False, '200.50.2.29'), (False, '200.50.2.30'), 
(False, '200.50.2.31')]

\end{verbatim}


\end{itemize}

\subsubsection{Comparación de ICMP con ARP}
Una ventaja de ICMP para hacer Network Discovery es que informa en más detalle cuál fue el problema a la hora de buscar un host, de esta manera si el host es inalcanzable podría especificarse en el resultado de la función. Además, gracias a esto está seguro que es inalcanzable, a diferencia de ARP que puede dar falsos negativos debido a que se llega al timeout antes de alcanzar el host.

Dado que ARP tiene un alcance local, no se puede consultar sobre direcciones IP fuera del rango de nuestra red. Por el contrario, ICMP distribuye el pedido dentro y fuera de la red local. Además el tamaño de paquete para los pedidos ICMP es más grande que en el caso de ARP ya que maneja más información. Por otro lado, respecto a ICMP es posible que los routers no tengan la habilidad de responder este tipo de mensajes, por lo que puede resultar en falsos negativos.

Con respecto a ICMP, dado que se hacen consultas a direcciones IP públicas, en muchas ocasiones son direcciones dinámicas. Es por este motivo que se puede llegar a un falso positivo, de la siguiente manera: 
\begin{enumerate}
\item El host A tiene la dirección IP 200.0.0.0 y el host B conoce al host A con tal dirección.
\item Host A intercambia su dirección 200.0.0.0 con la 200.0.0.1 que le correspondía a otro host que está vivo.
\item Host A se cae.
\item Host B hace ICMPing a la dirección 200.0.0.0 para saber si el host A está vivo, y obtiene una respuesta positiva, pero el host A estaba caído.
\end{enumerate}

Esto es más difícil que ocurra con ARP ya que trabaja en una red local, que por lo general las direcciones son estáticas a menos que se resetee el router o se cambie por algún motivo.

De acuerdo al tipo de red en la que estemos trabajando, estas características pueden ser ventajas o desventajas dependiendo de las cualidades de la red. A continuación damos algunos casos, y nuestra elección del protocolo que más se adapta a las necesidades de la red para cada caso.

	\begin{itemize}
		\item {Caso 1:} Red hogareña, utilizada para compartir archivos e impresoras. 

En este caso, consideramos que es más conveniente utilizar ARP ya que para compartir archivos entre las máquinas de la misma red no es necesario conectarse a internet por lo que no consultará por direcciones IP fuera de la red, A pesar de que ICMP también se puede utilizar para el mismo fin, preferimos usar ARP ya que el tamaño de paquete es menor.

		\item {Caso 2:} Red de oficina, utilizada para videoconferencias con otras sucursales, búsqueda de información, etc.

Aquí no nos queda otra opción más que utilizar ICMP, ya que ARP tiene un alcance local solamente. 

	\end{itemize}



